-- table可以做为数组使用
local a = {10,20,30}
-- 增加一个索引。但是注意，因为table的特殊形式，所以索引不一定是连续的。
a[5] = 50
-- 与其它语言不同，数组的索引同样从1开始，也就是索引0是nil
-- 因为没有配置索引4，所以索引4是nil
print(a[0], a[1], a[2], a[3], a[4], a[5])


-- table做为字典使用（这其实应该是最正常的机制，而做为数组使用，可以视为一种语法糖）
local b = {["Ada"] = 18, ["Lucy"] = 20, ["2B"] = 25}
b["Athena"] = 1000
print(b["Ada"], b["Lucy"], b["2B"], b["Athena"], b["Artemis"])

-- 使用foreach来遍历table
-- 可以看到，这种循环是和输入的顺序没有关系的
for key,value in pairs(b) do
    print(key.." = "..value)
end
-- 通过ipairs可以确定顺序，但是无法用这个去遍历一个字典，只能遍历数组格式。
-- 而且可以从结果上发现，中断的项目就无法继承了。上面的a在索引4是nil，所以下面这个循环只能获得123的值。
for index,value in ipairs(a) do
    print(index.." = "..value)
end

-- 使用table表示最简单的结构
local player = {name="Ada", x=100, y=100}
local enemy = {name="2B", x=200, y=200}
local function print_chara(index, chara)
    print(index.." "..chara.name.." Postion "..chara.x.."-"..chara.y)
end
-- table中包含table，这种嵌套是无限的，因为值可以是任何类型
-- 也可以视为一种2维数组。但比2维数组强大的地方在于，每个项目不一定需要等维。
local player_list = {player,enemy}
for index, value in ipairs(player_list) do
    print_chara(index,value)    
end

-- 一个矩阵的小例子
local mat = {
    {1,0,0,0},
    {0,1,0,0},
    {0,0,1,0},
    {0,0,0,1}
}
for row_idx, row in ipairs(mat) do
    local value = ""
    for col_idx, col in ipairs(row) do
        value = value .. col .. " "
    end
    print(value)
end